package org.appfuse.dao.jdbc;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.sql.DataSource;

import org.apache.commons.dbutils.RowProcessor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.appfuse.dao.Dao;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.jdbc.support.lob.LobHandler;

import cn.newtest.common.dbutils.dialect.DBDialect;

/**
 * @author byb
 * 如果spring1.25则使用JdbcDaoSupport
 * 如果spring2.5+jdk1.42以上，则使用SimpleJdbcDaoSupport
 * 
 * SimpleJdbcTemplate内部包含了一个NamedParameterJdbcTemplate，所以NamedParameterJdbcTemplate能做的事情SimpleJdbcTemplate都能干
 * SimpleJdbcTemplate相对于NamedParameterJdbcTemplate主要增加了JDK5.0的泛型和可变长度参数支持。   
 * 
 * public <T> List<T> query(String sql, ParameterizedRowMapper<T> rm, Object... args) 
 * public <T> T queryForObject(String sql, ParameterizedRowMapper<T> rm, SqlParameterSource args)
 * public <T> List<T> query(String sql, ParameterizedRowMapper<T> rm, SqlParameterSource args)
 * getJdbcOperations返回的是JdbcOperations(实现JdbcTemplate)   
 * getNamedParameterJdbcOperations返回的是NamedParameterJdbcOperations(实现是NamedParameterJdbcTemplate)   
 * 
 * SimpleJdbcTemplate的方法中参数个数是动态的，但是只能用?代替参数
 *     String sql="update stu set s_name=?,s_sex=?,s_brith=? where s_id=?";
 *     simplejdbctemp.update(sql, stu.getSname(),stu.getSsex(),stu.getSbrith(),stu.getSid());
 * SimpleJdbcTemplate的第二个好处：SimpleJdbcTemplate使用ParameterizedBeanPropertyRowMapper.newInstance()可以直接返回对象，不用强制转换
 * 
 * 
 * NamedParameterJdbcTemplate内部包含了一个JdbcTemplate，所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干
 * NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能和可以主键自动增长值。
 * 
 * public Object queryForObject(String sql, Map paramMap, RowMapper rowMapper)，用map的好处是:x,x的值可以自由取，但是所有参数的值都必须要放到map中去
 * public Object queryForObject(String sql, SqlParameterSource paramSource, RowMapper rowMapper)
 * SqlParameterSource的两个主要实现MapSqlParameterSource和BeanPropertySqlParameterSource，用SqlParameterSource的好处是不用一个个的赋值,但是:x中的x的值必须和对象的属性名称一样
 * 
 * public int update(String sql, SqlParameterSource paramSource, KeyHolder generatedKeyHolder)保存数据获得主键。
 * int m=keyholder.getKey().intValue();
 * Map map=keyholder.getKeys();//这样可以得到联合主键的值
 * keyholder.getKeyList();//这样可以得到一些主主键值，若一次添加好几条记录
 * 
 * 1、Template模式的使用，使我们只关心，sql, 输入参数，输出映射。
 * 2、new BeanPropertySqlParameterSource(t) 直接把bean转成输入参数。
 * 3、ParameterizedBeanPropertyRowMapper.newInstance(UserInfo.class)直接将bean转成输出映射。
 * 4、一个dao根据输入参数不同，动态生成多条sql语句。很有一点ibatis的味道。
 * 5、不仅如此，Spring2.5还提供了name的自动转化。
 * 例如，他会把你SQL中的first_name自动转化成JavaBean中的firstName。类的属性字段名称要数据库中的字段名称一样或者数据库字段名为s_id类的名称为SId。
 * 如果你没有遵守这个规范则可以在select语句后面给数据库字段名取别名
 */

public class BaseDaoJdbc extends SimpleJdbcDaoSupport//JdbcDaoSupport 
implements Dao
{
	
	@Resource
    private DataSource dataSource;
 

    @PostConstruct
    void init() {
        setDataSource(dataSource);
    }
    
	protected final Log log = LogFactory.getLog(getClass());

	RowProcessor rowProcessor;

	public RowProcessor getRowProcessor() {	
		return rowProcessor;
	}

	public void setRowProcessor(RowProcessor rowProcessor) {
		this.rowProcessor = rowProcessor;
	}

	private LobHandler lobHandler;

	public LobHandler getLobHandler() {
		return lobHandler;
	}

	/**
	 * Set the LobHandler to use for BLOB/CLOB access. Could use a
	 * DefaultLobHandler instance as default, but relies on a specified
	 * LobHandler here.
	 *
	 * @see org.springframework.jdbc.support.lob.DefaultLobHandler
	 */
	public void setLobHandler(LobHandler lobHandler) {
		this.lobHandler = lobHandler;
	}

	private DBDialect dbDialect;

	public DBDialect getDbDialect() {
		return dbDialect;
	}

	public void setDbDialect(DBDialect dbDialect) {
		this.dbDialect = dbDialect;
	}

	public int getCount(String sql) {
		return getJdbcTemplate().queryForInt(sql);
	}

	public int executeSql(final String queryString) {
		return getJdbcTemplate().update(queryString);
	}

	public int[] batchUpdate(String[] queryStrings) {
		return getJdbcTemplate().batchUpdate(queryStrings);
	}
    /******************************************************************************/
	@Override
	public List getObjects(Class class1) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List getObjects(String s) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object getObject(Class class1, Serializable serializable) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object getObject(String s, Serializable serializable) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void removeObject(Class class1, Serializable serializable) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeObject(String s, Serializable serializable) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public List find(String s) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List find(String s, boolean flag) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List find(String s, int i, int j) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List find(String s, int i, int j, boolean flag) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List find(String s, Object[] aobj, int i, int j) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List findByNamedParam(String s, String[] as, Object[] aobj, int i,
			int j) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List findByNamedParam(String s, String[] as, List list, int i, int j)
			throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object getUniqueObject(String s) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object getUniqueObjectByNativeSql(String s) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void saveObjects(Collection collection) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeObjects(Collection collection) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void execute(String s) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void executeNativeSql(String s) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void executeNativeSql(String s, String[] as, Object[] aobj) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Collection filter(Collection collection, String s) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void mergeObject(Object arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mergeObject(String arg0, Object arg1) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void saveObject(Object arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void saveObject(String arg0, Object arg1) {
		// TODO Auto-generated method stub
		
	}
	
	
}
